"use strict";
//11.ts里面的类
// People2 父类 或 超类
class People2 {
    constructor(eye) {
        this.eye = eye;
        this.firstName = ""; //只能自己类内部访问
        this.lastName = ""; //子类或自己都可以访问 对象不能访问
        this.noses = "隆鼻"; //没有访问修饰符 默认就是public
        //这种访问修饰符的写法和 上面直接声明的一样
        this.eye = eye;
    }
}
// Student是子类 或 派生类
// 访问修饰符
class Student extends People2 {
    //构造函数
    constructor() {
        super('单眼皮'); //执行父类的构造函数
        //private 修饰的是私有属性，属性不能被对象和子类读取
        this.age = 18;
        //public 修饰的是共有属性,属性可以被子类和对象读取修改
        this.username = "laoxie";
        //protected 受保护的属性，它和 private 类似，区别是它在子类中也是允许被访问的,在对象不能访问
        this.money = 10.0;
        //只读属性
        this.gender = "男";
    }
    run(speed) {
        //在类的内部可以获取
        this.age; //正确
        this.money; //正确
        // this.firstName;// Error 私有属性不能在子类和对象被访问
        this.lastName; //正确 protected 属性子类中也是允许被访问的
        this.eye; //正确
    }
}
//静态属性 通过类调用
Student.hair = "长发";
let jerry = new Student();
// jerry.age;//私有 Error
jerry.username;
// jerry.money;// protected受保护的属性 只能类的内部或子类调用
jerry.gender;
// jerry.gender="女";//只读属性 Error
// jerry.hair; //hair是静态 只能通过类名访问 Error
Student.hair = "短发"; //正确
// jerry.eye; //在构造函数里面定义的访问修饰符
jerry.noses; //
//用接口来验证对象. 只能是公共属性.
let huluwa = new Student();
//11.2 抽象类 abstract  有抽象方法的类就是抽象类.
// 抽象方法 是只有方法定义 没有 方法体的方法就是抽象 且必须用abstract修饰
class Animal {
    //正常的方法  (完全方法)
    eat(food) { }
}
class Cat extends Animal {
    //子类 必须实现继承的抽象类里面 抽象方法.
    run(speed) { }
}
class Computer {
    constructor() {
        this.price = 10;
    }
    //类实现接口  必须实现接口里面定义的所有方法
    play(m, n) {
        m + n;
    }
}
class Ipad {
    play(m, n) {
    }
}
//11.4 类 和 接口都有泛型
class Phone {
    constructor(n) {
        this.name = n;
    }
    play() {
        let playname = this.name;
    }
}
let p2 = new Phone(14); //自动推论
let p3 = new Phone('华为P50'); //实例化的时候指定泛型T的类型
let d5 = {
    name: 'wangcai',
    age: 2
};
let d6 = {
    name: 15,
    age: "5岁"
};
